/*
 * @Description: 用于判断变量是对象还是数组
 * @Author: wangchao
 * @Date: 2023-01-28 13:46:50
 */
let arr= [1,2,3]
let obj = {a:1,b:2}
arr.toString = ()=>'不能使用的类型判断'
obj.toString = ()=>'不能使用的类型判断'

// 1. 暴力判断
// console.log(arr instanceof Array);
// console.log(obj instanceof Object);

// 2. toString判断 问题：toString的继承，可能会存在toString的重写
// console.log(arr.toString());
// console.log(arr.toString()==='[object Array]');
// console.log(obj.toString()==='[object Object]');

// 3. toString 优化,利用原型链，使用最原始的Object的toString
// console.log(Object.prototype.toString.apply(arr)==='[object Array]');
// console.log(Object.prototype.toString.apply(obj)==='[object Object]');

// 函数封装,判断准确的常用类型
function judgeType(data) {
  const typeStr = Object.prototype.toString.apply(data)
  if (typeStr==='[object Array]') {
    return 'array'
  }
  if (typeStr==='[object Object]') {
    return 'object'
  }
  if (typeStr==='[object RegExp]') {
    return 'reg'
  }
  if (typeStr==='[object Number]') {
    return 'number'
  }
  if (typeStr==='[object String]') {
    return 'string'
  }
  if (typeStr==='[object Undefined]') {
    return 'undefined'
  }
  if (typeStr==='[object Null]') {
    return 'null'
  }
}
// console.log(judgeType(arr));
// console.log(judgeType(/123/g));
// console.log(judgeType('sss'));
// console.log(judgeType(undefined));
console.log(judgeType(null));